<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

include_once('ExceptionDAO.php');
include_once('ExceptionElementoNaoEncontrado.php');
include_once 'util/MapError.php';
include_once 'TOLivro.php';
include_once 'TOTipo.php';
include_once 'TOEditora.php';
include_once 'TOAdmin.php';
include_once 'TOMovimentacao.php';
include_once 'TOPreco.php';

/**
 * DAO para operações de banco para Livro
 * @author Douglas Rafael
 * @package models
 */
class DAOLivro extends CI_Model {

    /**
     * Método para <b>Listar</b> todas as Livros cadastradas.
     * @return array TOLivro
     */
    public function get_all($init, $quant) {
        try {
            $this->db->select('item.codigo, item.isbn, item.titulo, item.subtitulo, item.titulo_original, item.edicao, item.ano, item.total_paginas,
                item.descricao as descricao_livro, item.localizacao, item.imagem, item.motivo_inatividade, 
                item.data_cadastro, item.item_tipo_id, item.editora_id, item.autor_id, item.usuario_admin_id,
                t.nome AS tipo_nome, a.nome AS autor_nome, e.nome AS editora_nome, ad.nome AS admin_nome, ad.sobrenome AS admin_sobrenome');
            $this->db->join('item_tipo t', 't.id = item_tipo_id');
            $this->db->join('autor a', 'a.id = item.autor_id');
            $this->db->join('editora e', 'e.id = item.editora_id');
            $this->db->join('usuario_admin ad', 'ad.id = item.usuario_admin_id');
            $this->db->order_by('item.codigo', 'ASC');
            $result = $this->db->get('item', $quant, $init);

            $livros = array();
            if ($result) {
                foreach ($result->result() as $value) {
                    $livro = new TOLivro();
                    $livro->codigo = $value->codigo;
                    $livro->isbn = $value->isbn;
                    $livro->titulo = $value->titulo;
                    $livro->subtitulo = $value->subtitulo;
                    $livro->titulo_original = $value->titulo_original;
                    $livro->edicao = $value->edicao;
                    $livro->ano = $value->ano;
                    $livro->total_paginas = $value->total_paginas;
                    $livro->descricao = $value->descricao_livro;
                    $livro->localizacao = $value->localizacao;
                    $livro->imagem = $value->imagem;
                    $livro->motivo_inatividade = $value->motivo_inatividade;
                    $livro->data_cadastro = $value->data_cadastro;

                    $livro->tipo = new TOTipo();
                    $livro->tipo->codigo = $value->item_tipo_id;
                    $livro->tipo->nome = $value->tipo_nome;

                    $livro->autor = new TOAutor();
                    $livro->autor->codigo = $value->autor_id;
                    $livro->autor->nome = $value->autor_nome;

                    $livro->editora = new TOEditora();
                    $livro->editora->codigo = $value->editora_id;
                    $livro->editora->nome = $value->editora_nome;

                    $this->load->model('DAOCategoria');
                    $livro->categorias = new TOCategoria();
                    $livro->categorias = $this->DAOCategoria->get_categorias($value->codigo);

                    $this->load->model('DAOMovimentacao');
                    $livro->movimentacao = new TOMovimentacao();
                    $livro->movimentacao = $this->DAOMovimentacao->get($livro->codigo);

                    $livro->admin = new TOAdmin();
                    $livro->admin->codigo = $value->usuario_admin_id;
                    $livro->admin->nome = $value->admin_nome + ' ' + $value->admin_sobrenome;

                    array_push($livros, $livro);
                }
            }
            return $livros;
        } catch (Exception $e) {
            throw new ExceptionDAO('Não foi possível obter lista de livros.');
        }
    }

    public function get(TOLivro $livro) {
        try {
            $this->db->select('item.codigo, item.isbn, item.titulo, item.subtitulo, item.titulo_original, item.edicao, item.ano, item.total_paginas,
                item.descricao as descricao_livro, item.localizacao, item.imagem, item.motivo_inatividade, 
                item.data_cadastro, item.item_tipo_id, item.editora_id, item.autor_id, item.usuario_admin_id,
                t.nome AS tipo_nome, a.nome AS autor_nome, e.nome AS editora_nome, ad.nome AS admin_nome, ad.sobrenome AS admin_sobrenome');
            $this->db->join('item_tipo t', 't.id = item.item_tipo_id');
            $this->db->join('autor a', 'a.id = autor_id');
            $this->db->join('editora e', 'e.id = editora_id');
            $this->db->join('usuario_admin ad', 'ad.id = item.usuario_admin_id');
            $this->db->where('codigo', $livro->codigo);
            $result = $this->db->get('item');
            
            if ($value = $result->row()) {
                $livro = new TOLivro();
                $livro->codigo = $value->codigo;
                $livro->isbn = $value->isbn;
                $livro->titulo = $value->titulo;
                $livro->subtitulo = $value->subtitulo;
                $livro->titulo_original = $value->titulo_original;
                $livro->edicao = $value->edicao;
                $livro->ano = $value->ano;
                $livro->total_paginas = $value->total_paginas;
                $livro->descricao = $value->descricao_livro;
                $livro->localizacao = $value->localizacao;
                $livro->imagem = $value->imagem;
                $livro->motivo_inatividade = $value->motivo_inatividade;
                $livro->data_cadastro = $value->data_cadastro;

                $livro->tipo = new TOTipo();
                $livro->tipo->codigo = $value->item_tipo_id;
                $livro->tipo->nome = $value->tipo_nome;

                $livro->autor = new TOAutor();
                $livro->autor->codigo = $value->autor_id;
                $livro->autor->nome = $value->autor_nome;

                $livro->editora = new TOEditora();
                $livro->editora->codigo = $value->editora_id;
                $livro->editora->nome = $value->editora_nome;

                $this->load->model('DAOCategoria');
                $livro->categorias = new TOCategoria();
                $livro->categorias = $this->DAOCategoria->get_categorias($value->codigo);

                $livro->admin = new TOAdmin();
                $livro->admin->codigo = $value->usuario_admin_id;
                $livro->admin->nome = $value->admin_nome + ' ' + $value->admin_sobrenome;

                $this->load->model('DAOMovimentacao');
                $livro->movimentacao = new TOMovimentacao();
                $livro->movimentacao = $this->DAOMovimentacao->get($livro->codigo);
                
                return $livro;
              
            } else {
                throw new ExceptionDAO('Não foi possível obter os dados do livro.');
            }
        } catch (ExceptionDAO $ed) {
            throw $ed;
        } catch (Exception $e) {
            $num = $this->db->_error_number();
            $msg = $this->db->_error_message();

            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($num, $msg));
        }
    }

    public function status(TOLivro $livro) {
        try {
            $this->db->where('codigo', $livro->codigo);
            $result = $this->db->get('item_status');
        } catch (Exception $e) {
            
        }
    }

    /**
     * Retorna o Total de registros da tabela Livro.
     * @return string total de resgistros
     */
    public function quant_all() {
        $this->db->where('item_tipo_id', 1);
        return $this->db->count_all_results('item');
    }

    /**
     * Método para <b>Inserir</b> Livro.
     * @param TOLivro $Livro
     * @throws ExceptionDAO 
     */
    public function insert(TOLivro $Livro) {
        $this->db->set('nome', $Livro->nome);
        $this->db->set('descricao', $Livro->descricao);
        $this->db->set('sequencia', $Livro->sequencia);
        $this->db->set('status', $Livro->status);

        $result = $this->db->insert('Livro');

        //Pegando o erro caso exista
        if (!$result) {
            $num = $this->db->_error_number();
            $msg = $this->db->_error_message();

            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($num, $msg, $Livro->nome));
        }
    }

    /**
     * Método para <b>Atualizar</b> dados do Livro.
     * @param TOLivro $Livro 
     */
    public function update(TOLivro $Livro) {
        $this->db->set('nome', $Livro->nome);
        $this->db->set('descricao', $Livro->descricao);
        $this->db->set('sequencia', $Livro->sequencia);
        $this->db->set('status', $Livro->status);
        $this->db->where('id', $Livro->codigo);

        $result = $this->db->update('Livro');

        //Pegando o erro caso exista
        if (!$result) {
            $num = $this->db->_error_number();
            $msg = $this->db->_error_message();

            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($num, $msg, $Livro->nome));
        }
    }

    /**
     * Método para <b>Excluir</b> Livro de acordo com o código.
     * @param TOLivro $Livro
     * @throws ExceptionDAO 
     */
    public function delete(TOLivro $Livro) {
        $this->db->where_in('id', $Livro->codigo);
        $result = $this->db->delete('Livro');

        if (!$result) {
            $num = $this->db->_error_number();
            $msg = $this->db->_error_message();

            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($num, $msg, $Livro->nome));
        }
    }

    /**
     * Método para <b>Buscar</b> Livro
     * @param type $init
     * @param type $quant
     * @param type $term
     * @return array
     * @throws ExceptionDAO 
     */
    public function search($init, $quant, $term) {
        $this->db->like('id', $term);
        $this->db->or_like('nome', $term);
        $this->db->order_by("sequencia", "ASC");

        $result = $this->db->get('Livro', $quant, $init);

        if ($result) {
            $Livros = array();
            foreach ($result->result() as $value) {
                $Livro = new TOLivro();
                $Livro->codigo = $value->id;
                $Livro->nome = $value->nome;
                $Livro->descricao = $value->descricao;
                $Livro->sequencia = $value->sequencia;
                $Livro->status = $value->status;
                array_push($Livros, $Livro);
            }
        } else {
            $num = $this->db->_error_number();
            $msg = $this->db->_error_message();

            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($num, $msg, $Livro->nome));
        }
        return $Livros;
    }

    public function quant_search($term) {
        $this->db->like('id', $term);
        $this->db->or_like('nome', $term);

        return $this->db->count_all_results('Livro');
    }

}